home *** CD-ROM | disk | FTP | other *** search
- 4PRN Cookie
- ***********
-
- Dieser Cookie wird vom Treiberprogramm zur 4-Druckerport-Karte Mulpri
- eingerichtet. Diese Karte stellt 4 Druckerports zur Verfügung, die
- kompatibel zum Originalport sind (inklusive Eingabefunktion) und
- softwaremäßig umgeschaltet werden.
-
- Cookie-Name: 4PRN
- Cookie-Wert: Zeiger auf Struktur, beginnend auf gerader Adresse
-
-
- Die Vierprn-Struktur
- --------------------
-
- Alle Strukturelemente sind 32Bit lang.
-
- Die Anzahl der Strukturelemente und damit der Funktionsumfang wird in
- Zukunft erweitert. Deshalb ist am Anfang die Anzahl eingetragen, die immer
- mindestens 3 beträgt. Möchte man die Funktion eines bestimmten
- Strukturelements nutzen, muß man zuerst anhand der Anzahl prüfen, ob es
- existiert.
-
- Alle Funktionen müssen im Supervisormode aufgerufen werden. Parameter
- werden C-mäßig auf dem Stack übergeben. Die Routinen können auch 4 Byte
- hinter ihrem Beginn mit de(m/n) Parameter(/n) in Register D0 aufgerufen
- werden. Ein einzelner Parameter ist entsprechend als WORD oder LONG zu
- übergeben. Bei zwei WORD-Parametern ist der erste im Highword und der
- zweite im Lowword zu übergeben. Der Rückgabewert wird in Register D0
- geliefert. Nicht erklärte Bit im Eingabeparameter sind auf 0 zu setzen,
- nicht erklärte Bit des Ausgabeparameters können beliebige Werte haben.
- Register D0, D1, A0, A1 werden durch die Routinen zerstört. Wenn nicht
- extra angegeben, beeinflußt eine Routine die Einstellung des aktiven Ports
- nicht, obwohl sie durchaus kurz in- und zurückschalten könnte.
-
- Damit es beim Multitasking kein Chaos gibt, sind zwei LOCKED-Zustände
- definiert. Beim "Normalzustand" LOCKED1P wurde ein bestimmter Port
- aktiviert. Andere Programme dürfen den aktiven Port bis zur Aufhebung
- dieses Zustandes nicht umschalten. Die Funktionen zur Ausgabe auf einen
- ganz bestimmten Port sind davon aber nicht betroffen. Bei LOCKED4P wurde
- die gesamte Mulpri-Karte von einem Programm reserviert. Eine Umschaltung
- zwischen den Ports ist bis zur Aufhebung dieses Zustandes nur dem einen
- Programm gestattet, das die Adresse der Spezialroutine kennt. Wenn sich
- kein Programm speziell für die Karte interessiert, ist zwar auch ein Port
- durchgeschaltet, der Zustand des Treibers aber nicht LOCKED, also frei.
-
- Px wird als Platzhalter überall in der Erklärung benutzt, wo eine 1, 2, 4
- oder 8 für den Druckerport 1 bis 4 stehen kann. Diese ungewöhnliche
- Numerierung wurde aus Geschwindigkeitsgründen benutzt.
-
-
- Vierprn-Struktur in C-Notation
- ------------------------------
- struct
- { LONG Maxfun; /* Anzahl der Strukturelemente */
- LONG Activport; /* Nummer des aktiven Ports */
- LONG (*Pswitch)(); /* Zeiger auf Funktion zur Umschaltung */
- LONG (*Pbusy)(); /* Zeiger auf Funktion zur BUSY-Testung */
- LONG (*Pstrobe)(); /* Zeiger auf Funktion zur STROBE-Steuerung */
- LONG (*Psetdata)(); /* Zeiger auf Funktion zum Daten ausgeben */
- LONG (*Pput)(); /* Zeiger auf Funktion zum Drucken eines Zeichens */
- } Vierprn;
-
-
- LONG Maxfun
- Anzahl der insgesamt vorhandenen 32Bit-Werte
-
- LONG Activport
- Mögliche Werte: 1, 2, 4, 8. Hier steht die Nummer des aktiven Ports, auch
- wenn kein LOCKED existiert. Diese Stelle darf nur gelesen werden! Sie ist
- für Interruptroutinen gedacht. Spezialhinweis: Nur bei IPL7 können Wert und
- eingestellter Port differieren. Man sollte deshalb nie in einem
- IPL7-Interrupt (der nichtmaskierbare, kann z.B. vom VME-Bus ausgelöst
- werden) auf 4-Port-Zeug zugreifen. Umgehungsvariante (auch für
- Soundchipzugriffe, die normalerweise mit IPL6 oder IPL7 geklammert werden,
- damit keiner zwischendurch die Registerauswahl ändert) ist ein Test des auf
- dem Stack abgelegten Statusregisters. Zeigt diese Statusregister-Kopie ein
- IPL kleiner 6, so darf man zugreifen.
-
- LONG Pswitch(WORD switch)
- switch:
- -1
- erfrage Nummer des aktiven Ports
- liefert -1, falls LOCKED4P aktiv ist
- 0, falls kein LOCKED aktiv ist, also die Ports frei sind
- Px des aktiven Ports, falls LOCKED1P aktiv ist
- 0
- hebt LOCKED1P-Zustand auf. Ehrlicherweise sollte nur der
- LOCKED1P-Verursacher es aufheben. Wirkungslos bei LOCKED4P.
- Px
- aktiviere Port Px und LOCKED1P ihn. Liefert Px des vorher aktiven Ports
- oder 0, wenn Umschaltung wegen LOCKED unmöglich war.
-
- LONG Pbusy(WORD pp)
- liefert Busy von Port pp
- pp: Px
- Rückgabe: BUSY-Bit des Ports pp in bit0
-
- LONG Pstrobe(WORD pp, WORD strobe)
- setzt STROBE-Signal von Port pp
- pp: Px
- strobe: bit5 repräsentiert Pegel für STROBE-Leitung
- Rückgabe: nichts
-
- LONG Psetdata(WORD pp, WORD data)
- setzt die Daten (bit7..0) von Port pp auf den Wert data
- pp: Px
- data: bit7..0 enthalten Datenbit
- Rückgabe: nichts
- Der Port wird automatisch auf Ausgabe geschaltet, da sonst der Aufruf
- dieser Funktion sinnlos wäre. Falls man einzelne Bits setzen/löschen
- will, sollte man sich den alten Ausgabewert selbst merken.
-
- LONG Pput(WORD pp, WORD zeichen)
- druckt ein Zeichen aus, wenn Drucker nicht busy ist
- pp: Px
- zeichen: bit7..0 enthalten auszugebendes Zeichen
- Rückgabe: -1 wenn Zeichen gedruckt wurde
- 0 wenn Zeichen nicht gedruckt wurde
- Der Port wird automatisch auf Ausgabe geschaltet, da sonst der Aufruf
- dieser Funktion sinnlos wäre. Das Zeichen wird auf D7..0 gelegt und /STROBE
- auf inaktiv (high). BUSY wird getestet. Ist es aktiv (high), so wird sofort
- mit Fehlermeldung 0 beendet. Ist es inaktiv (low), so wird ein
- /STROBE-Impuls (low) gegeben, und Rückmeldung ist -1. Die Routine wartet
- also nicht.
-
-
- Druckerspooler
- --------------
- Hier ahne ich schon viele Probleme...
- So können MFP-BUSY-Bit-Interrupt getriebene Druckerspooler korrekt mit
- 4-Port zusammenarbeiten: Tritt der BUSY-Interrupt auf, muß zuerst getestet
- werden, ob der eigene Port aktiv ist (Activport). Wenn ja, muß noch
- getestet werden, ob wirklich die gewünschte (nicht-)BUSY-Bedingung
- vorliegt, dann darf die Ausgabe erfolgen. Andernfalls muß der Interrupt
- beendet werden.
-
- Natürlich kann sich ein Spooler auch in einen Timer-Interrupt einhängen und
- dann einfach auf Verdacht die Routine Pput aufrufen. Anhand des
- Rückgabewertes stellt er fest, ob er sein Byte losgeworden ist oder nicht.
-
-
- Harun Scheutzow, (C) SWB 27.07.1993 und später
- letzte Änderung: 07.08.1993
-
- Harun Scheutzow
- Dresdener Straße 83
- 10179 Berlin
-
- Email:
- im Mausnetz: Harun Scheutzow @B
- aus dem Internet: Harun_Scheutzow@B.maus.de
-